<?php

class Dpto {
    
    /**
     * El código identificador del departamento
     * Nota: Exactamente 6 caracteres.
     *
     * @var string
     */
    private $id;
    
    /**
     * El nombre del departamento.
     * Nota: Max 15 caracteres.
     *
     * @var string
     */
    private $nombre;
    
    /**
     * Breve descripción de la función del departamento.
     * Nota: Max 100 caracteres.
     *
     * @var string
     */
    private $descripcion;
    
    /**
     * Departamento padre, si lo hubiera.
     *
     * @var dpto
     */
    private $dptoPadre;
    
    /**
     * Arreglo con referencias a los departamentos hijos de éste departamento.
     *
     * @var unknown_type
     */
    private $dptosHijos;
    
    public function __construct($id, $nombre)
    {
        $this->id = $id;
        $this->nombre = $nombre;
    }
    
    /**
     * Obtiene el código identificador del departamento.
     *
     * @return string
     */
    public function getId()
    {
         return $this->id;
    }
    
    /**
     * Modifica el nombre del departamento.
     *
     * @param string $nombre
     */
    public function setNombre($nombre)
    {
        $this->nombre = $nombre;
    }
    
    /**
     * Obtiene el nombre del departamento.
     *
     * @return unknown
     */
    public function getNombre()
    {
        return $this->nombre;
    }
    
    /**
     * Modifica la breve descripción del departamento.
     *
     * @param string $descripcion
     */
    public function setDescripcion($descripcion)
    {
        $this->descripcion = $descripcion;
    }
    
    /**
     * Obtiene la breve descripción del departamento.
     *
     * @return string
     */
    public function getDescripcion()
    {
        return $this->descripcion;
    }
    
    /**
     * Asigna un departamento como padre de éste departamento.
     *
     * @param Dpto $dptoPadre
     */
    public function setDptoPadre($dptoPadre)
    {
        //Eliminamos la referencia en el anterior padre, si lo hubo.
        if ($this->dptoPadre != NULL)
            $this->removeDptoHijo($this);
        
        //Creamos la referencia en el nuevo padre, si lo hay.
        if ($dptoPadre != NULL)
            $dptoPadre->addDptoHijo($this);
            
        $this->dptoPadre = $dptoPadre;
    }
    
    /**
     * Obtiene el departamento padre de éste departamento.
     *
     * @return Dpto
     */
    public function getDptoPadre()
    {
        return $this->dptoPadre;
    }
    
    /**
     * Adiciona un hijo a la lista de departamentos hijos.
     *
     * @param Dpto $dptoHijo
     */
    protected function addDptoHijo(Dpto $dptoHijo)
    {
        $this->dptosHijos[] = $dptoHijo;
    }
    
    /**
     * Elimina el departamento proporcionado de la lista de departamentos hijos.
     *
     * @param Dpto $dpto
     */
    protected function removeDptoHijo(Dpto $dpto)
    {
        if (($res = array_search($dpto, $this->$dpto)) !== false) {
            unset($this->dptosHijos[$res]);
        }
    }
    
    /*public function setDptosHijos($dptosHijos)
    {
        $this->dptosHijos = $dptosHijos;
    }*/
    
    /**
     * Obtiene la lista de departamentos hijos.
     * 
     * @return array
     */
    public function getDptosHijos()
    {
        return $this->dptosHijos;
    }
    
}

?>